package com.smart.community.property.dto;

import com.smart.community.commons.base.BaseDTO;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 物业费数据传输对象
 * @author Wu.Liang
 * @since 2025-06-26
 * @version 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class PropertyFeeDTO extends BaseDTO {
    private static final long serialVersionUID = -1430876520570069554L;

	/**
     * 社区ID
     */
    private Long communityId;
    
    /**
     * 楼栋ID - 查询条件
     */
    private Long buildingId;
    
    /**
     * 单元ID - 查询条件
     */
    private Long unitId;
    
    /**
     * 房户ID - 查询条件
     */
    private Long householdId;
    
    /**
     * 房户ID列表 - 批量查询条件
     */
    private List<Long> householdIds;
    
    /**
     * 用户ID
     */
    private Long userId;
    
    /**
     * 费用类型：1-物业费，2-水费，3-电费，4-燃气费，5-卫生费
     */
    @Min(value = 1, message = "费用类型值无效")
    @Max(value = 5, message = "费用类型值无效")
    private Integer feeType;
    
    /**
     * 费用名称
     */
    @Size(max = 50, message = "费用名称长度不能超过50个字符")
    private String feeName;
    
    /**
     * 计费周期
     */
    @Size(max = 20, message = "计费周期长度不能超过20个字符")
    private String billingPeriod;
    
    /**
     * 费用金额
     */
    @DecimalMin(value = "0.01", message = "费用金额必须大于0")
    @Digits(integer = 10, fraction = 2, message = "费用金额格式不正确")
    private BigDecimal amount;
    
    /**
     * 缴费截止日期
     */
    private LocalDate dueDate;
    
    /**
     * 缴费状态：0-未缴费，1-已缴费，2-部分缴费，3-逾期
     */
    private Integer paymentStatus = 0;
    
    /**
     * 已缴金额
     */
    @DecimalMin(value = "0.00", message = "已缴金额不能为负数")
    @Digits(integer = 10, fraction = 2, message = "已缴金额格式不正确")
    private BigDecimal paymentAmount = BigDecimal.ZERO;
    
    /**
     * 缴费方式：wechat-微信，alipay-支付宝，bank-银行卡，balance-余额
     */
    @Size(max = 20, message = "缴费方式长度不能超过20个字符")
    private String paymentMethod;
    
    /**
     * 缴费时间
     */
    private LocalDate paymentTime;
    
    /**
     * 在线支付ID
     */
    private Long onlinePaymentId;
    
    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    private String remark;
    
    /**
     * 数据权限：可访问的社区ID列表
     */
    private List<Long> communityIds;
    
    /**
     * 查询条件：当前页
     */
    @Min(value = 1, message = "当前页必须大于0")
    private Integer current = 1;
    
    /**
     * 查询条件：每页大小
     */
    @Min(value = 1, message = "每页大小必须大于0")
    @Max(value = 100, message = "每页大小不能超过100")
    private Integer size = 10;
    
    /**
     * 查询条件：关键词
     */
    @Size(max = 100, message = "关键词长度不能超过100个字符")
    private String keyword;
    
    /**
     * 查询条件：开始日期
     */
    private LocalDate queryStartDate;
    
    /**
     * 查询条件：结束日期
     */
    private LocalDate queryEndDate;
    
    /**
     * 计算剩余金额
     * @return 剩余金额
     */
    public BigDecimal getRemainingAmount() {
        if (amount == null) {
            return BigDecimal.ZERO;
        }
        if (paymentAmount == null) {
            return amount;
        }
        return amount.subtract(paymentAmount);
    }
    
    /**
     * 判断是否已完全缴费
     * @return 是否已完全缴费
     */
    public boolean isFullyPaid() {
        return getRemainingAmount().compareTo(BigDecimal.ZERO) == 0;
    }
    
    /**
     * 判断是否逾期
     * @return 是否逾期
     */
    public boolean isOverdue() {
        if (dueDate == null) {
            return false;
        }
        return LocalDate.now().isAfter(dueDate) && !isFullyPaid();
    }
    
    /**
     * 验证缴费信息
     * @return 验证结果
     */
    public boolean validatePayment() {
        if (paymentAmount == null || paymentAmount.compareTo(BigDecimal.ZERO) <= 0) {
            return false;
        }
        if (paymentAmount.compareTo(amount) > 0) {
            return false;
        }
        return true;
    }
} 